package impl

import (
	"github.com/starmotioncf/common/linked"
	"github.com/starmotioncf/soutchatinternal/repository"
	"sync"
)

type sensitiveRepository struct {
	*repository.Repository
	mux           *sync.RWMutex
	sensitiveTrie *linked.SensitiveTrie //贪婪
}

func NewSensitiveRepository(r *repository.Repository) repository.SensitiveRepository {
	_r := &sensitiveRepository{
		Repository:    r,
		mux:           &sync.RWMutex{},
		sensitiveTrie: linked.NewSensitiveTrie(linked.WithSensitiveTrieGreed(true)),
	}
	//_r.init()
	return _r
}

//
//func (r *sensitiveRepository) init() {
//	r.mcache.Register(mcache.SensitiveConfig, func(ctx context.Context) (any, error) {
//		list, err := r.getAll(ctx)
//		if err != nil {
//			return nil, err
//		}
//		//有更新的时候，更新下敏感词二叉树
//		r.initSensitiveTrie(list)
//		return list, nil
//	})
//}
//
//func (r *sensitiveRepository) initSensitiveTrie(list []*model.VcSensitiveWord) {
//	r.mux.Lock()
//	defer r.mux.Unlock()
//	r.sensitiveTrie = linked.NewSensitiveTrie(linked.WithSensitiveTrieGreed(true))
//	if list == nil || len(list) == 0 {
//		return
//	}
//	//构建敏感词二叉树
//	for i := range list {
//		if list[i].Content == "" {
//			continue
//		}
//		//非中文，非阿语后面加个空格,全小写
//		if !utils.ContainsChinese(list[i].Content) {
//			list[i].Content = " " + strings.ToLower(list[i].Content) + " "
//		}
//		r.sensitiveTrie.AddWord(list[i])
//	}
//}
//
//func (r *sensitiveRepository) Match(ctx context.Context, content string) *model.VcSensitiveWord {
//	r.mux.RLock()
//	rst := r.sensitiveTrie
//	r.mux.RUnlock()
//	mws := make([]*linked.MatchSensitiveWord, 0)
//	if utils.ContainsArabic(content) {
//		//包含阿语的特殊处理
//		contentArr := strings.Split(content, " ")
//		for i := range contentArr {
//			if contentArr[i] == "" || contentArr[i] == " " {
//				continue
//			}
//			if _mws := rst.Match(" " + strings.ToLower(contentArr[i]) + " "); _mws != nil {
//				mws = append(mws, _mws...)
//			}
//		}
//	} else {
//		mws = rst.Match(strings.ToLower(" " + content + " "))
//	}
//	if len(mws) == 0 {
//		return nil
//	}
//	if len(mws) > 1 {
//		//排序去等级最大的
//		slices.SortFunc(mws, func(a, b *linked.MatchSensitiveWord) int {
//			levelA := a.Word.(*model.VcSensitiveWord).Level
//			levelB := b.Word.(*model.VcSensitiveWord).Level
//			if levelA > levelB {
//				return -1
//			}
//			if levelA < levelB {
//				return 1
//			}
//			return 0
//		})
//	}
//	return mws[0].Word.(*model.VcSensitiveWord)
//}
//
//func (r *sensitiveRepository) getAll(ctx context.Context) (m []*model.VcSensitiveWord, err error) {
//	err = r.DB(ctx).Model(&model.VcSensitiveWord{}).Where("deleted_at = 0").Find(&m).Error
//	return m, err
//}
//
//func (r *sensitiveRepository) GetAll(ctx context.Context) (m []*model.VcSensitiveWord, err error) {
//	_m, err := r.mcache.Load(mcache.SensitiveConfig)
//	if err != nil {
//		return nil, err
//	}
//	return _m.([]*model.VcSensitiveWord), err
//}
//
//func (r *sensitiveRepository) Foreach(ctx context.Context, fn func(v *model.VcSensitiveWord) error) (err error) {
//	list, err := r.GetAll(ctx)
//	if err != nil {
//		return err
//	}
//	for i := range list {
//		if err = fn(list[i]); err != nil {
//			return err
//		}
//	}
//	return nil
//}
